package com.jzo2o.trade.config;


import com.wechat.pay.java.core.Config;
import com.wechat.pay.java.core.RSAAutoCertificateConfig;
import com.wechat.pay.java.core.notification.NotificationConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @Description TODO
 * @Author bo.li
 * @Date 2024/9/3 8:34
 * @Version 1.0
 */

/**
 * 微信支付核心配置类
 * 用于初始化微信支付所需的配置对象，包括API调用配置和通知处理配置
 */
@Configuration
public class WxPayConfig {

    @Autowired
    private WeChatPayProperties wxPayProperties;


    /**
     * 创建微信支付基础配置Bean
     * 该配置用于微信支付API的调用，包括请求签名、响应验签等功能
     *
     * @return Config 微信支付基础配置实例
     *         - merchantId: 商户号，唯一标识一个微信支付商户
     *         - privateKey: 商户私钥，用于API请求签名
     *         - merchantSerialNumber: 商户API证书序列号，用于身份认证
     *         - apiV3Key: APIv3密钥，用于请求签名和数据加解密
     */
    @Bean
    public Config config(){
        // 使用RSA自动证书管理模式构建配置对象
        // 自动管理平台证书的下载和更新，无需手动维护证书文件
        Config config = new RSAAutoCertificateConfig.Builder()
                // 设置商户号 - 微信支付为每个商户分配的唯一标识
                .merchantId(wxPayProperties.getMerchantId())
                // 设置商户私钥 - 用于API请求签名和响应验签
                .privateKey(wxPayProperties.getPrivateKey())
                // 设置商户证书序列号 - 标识商户API证书的唯一编号
                .merchantSerialNumber(wxPayProperties.getMerchantSerialNumber())
                // 设置APIv3密钥 - 用于请求签名和敏感信息加解密
                .apiV3Key(wxPayProperties.getApiV3Key())
                // 构建配置对象
                .build();
        return config;
    }

    /**
     * 创建微信支付通知配置Bean
     * 该配置用于处理微信支付异步通知，包括通知验签和数据解密
     *
     * @return NotificationConfig 微信支付通知配置实例
     *         - merchantId: 商户号，验证通知来源的合法性
     *         - privateKey: 商户私钥，用于通知数据解密
     *         - merchantSerialNumber: 商户证书序列号，匹配对应证书进行验签
     *         - apiV3Key: APIv3密钥，用于通知数据解密
     */
    @Bean
    public NotificationConfig notificationConfig(){
        // 使用RSA自动证书管理模式构建通知配置对象
        // 同样支持自动证书管理，确保通知验签使用的证书始终有效
        NotificationConfig config = new RSAAutoCertificateConfig.Builder()
                // 设置商户号 - 验证通知是否来自合法商户
                .merchantId(wxPayProperties.getMerchantId())
                // 设置商户私钥 - 用于解密通知中的敏感数据
                .privateKey(wxPayProperties.getPrivateKey())
                // 设置商户证书序列号 - 匹配对应证书验证通知签名
                .merchantSerialNumber(wxPayProperties.getMerchantSerialNumber())
                // 设置APIv3密钥 - 用于解密通知中的敏感信息
                .apiV3Key(wxPayProperties.getApiV3Key())
                // 构建通知配置对象
                .build();
        return config;
    }
}
